home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-03-10 | 9.1 KB | 435 lines | [TEXT/PJMM] |
- unit MyUtils;
-
- interface
-
- type
- versionRecord = packed record
- version: integer;
- devcode: byte;
- revision: byte;
- country: integer;
- short: str15;
- long: str255;
- name: str63;
- end;
-
- function TrapAvailable (tNumber: INTEGER): BOOLEAN;
- function MyNumToString (n: longInt): str255;
- function NumToStr (n: longInt): str255;
- function NN (n: longInt; len: integer): str31;
- function StrToNum (s: str255): longInt;
- procedure DotDotDot (var s: str255; var width: integer);
- procedure SetItemEnable (mh: menuHandle; item: integer; enable: boolean);
- procedure SetIDItemEnable (menu, item: integer; enable: boolean);
- function GetIDItemEnable (menu, item: integer): boolean;
- function GetItemEnable (mh: menuHandle; item: integer): boolean;
- procedure DotItem (mh: menuHandle; item: integer; dotted: boolean);
- function MyFrontWindow: boolean;
- function DAFrontWindow: boolean;
- function GetIndStrSize (size, id, index: integer): str255;
- procedure GetVersion (var vers: versionRecord);
- procedure SetVersionParamText (c3: str255);
- function GetDirID (wdrn: integer; var vrn: integer; var dirID: longInt): OSErr;
- function GetVolInfo (var name: str63; var vrn: integer; index: integer; var CrDate: longInt): OSErr;
- procedure PlotSICN (id: integer; index, v, h: integer);
- function HLockState (h: univ handle): signedByte;
- function LookupStrh (id: integer; match: str255): str255;
- function LookupStrhNumber (id: integer; n: longInt): str255;
- function TouchDir (fs: FSSpec): OSErr;
- function CreateUniqueFile (var fs: FSSpec; creator, ftype: OSType): OSErr;
- function MyFSWrite (refnum: integer; len: longInt; p: ptr): OSErr;
-
- procedure SegmentInit;
- procedure SegmentUtil;
- procedure SegmentUtil2;
- procedure SegmentTerm;
-
- implementation
-
- uses
- MyTypes, Traps, Folders;
-
- {$S Init}
- procedure SegmentInit;
- begin
- end;
-
- {$S Util}
- procedure SegmentUtil;
- begin
- end;
-
- {$S Util2}
- procedure SegmentUtil2;
- begin
- end;
-
- {$S Term}
- procedure SegmentTerm;
- begin
- end;
-
- {$S Util}
- function TrapAvailable (tNumber: INTEGER): BOOLEAN;
- {Check to see if a given trap is implemented. Babble as taken from IM6 }
- const
- TrapMask = $0800;
- var
- tType: TrapType;
- ignoreError: OSErr;
- begin
- if BAND(tNumber, TrapMask) > 0 then
- tType := ToolTrap
- else
- tType := OSTrap;
- if tType = ToolTrap then begin
- tNumber := BAND(tNumber, $7FF);
- if tNumber >= $400 then
- tNumber := _Unimplemented
- else if tNumber >= $200 then
- if NGetTrapAddress($A86E, ToolTrap) <> NGetTrapAddress($AA6E, ToolTrap) then
- tNumber := _Unimplemented;
- end;
- TrapAvailable := NGetTrapAddress(tNumber, tType) <> GetTrapAddress(_Unimplemented);
- end; {TrapAvailable}
-
- {$S Util}
- function MyNumToString (n: longInt): str255;
- var
- s: str255;
- begin
- if abs(n) < 4096 then
- NumToString(n, s)
- else if abs(n) < 4194304 then begin
- NumToString(n div 1024, s);
- s := Concat(s, 'k');
- end
- else begin
- NumToString(n div 1048576, s);
- s := Concat(s, 'M');
- end;
- MyNumToString := s;
- end;
-
- {$S Util}
- function NumToStr (n: longInt): str255;
- var
- s: str255;
- begin
- NumToString(n, s);
- NumToStr := s;
- end;
-
- {$S Util}
- function NN (n: longInt; len: integer): str31;
- var
- s: str31;
- begin
- s := NumToStr(n);
- while length(s) < len do
- s := concat('0', s);
- NN := s;
- end;
-
- {$S Util}
- function StrToNum (s: str255): longInt;
- var
- n: longInt;
- begin
- StringToNum(s, n);
- StrToNum := n;
- end;
-
- {$S Util2}
- procedure DotDotDot (var s: str255; var width: integer);
- var
- maxwidth, len: integer;
- begin
- maxwidth := width;
- width := StringWidth(s);
- if width > maxwidth then begin
- width := width + CharWidth('…');
- {$PUSH}
- {$R-}
- len := ord(s[0]);
- while (len > 0) and (width > maxwidth) do begin
- width := width - CharWidth(s[len]);
- len := len - 1;
- end;
- len := len + 1;
- s[0] := chr(len);
- s[len] := '…';
- {$POP}
- end;
- end;
-
- {$S}
- procedure SetItemEnable (mh: menuHandle; item: integer; enable: boolean);
- begin
- if enable then
- EnableItem(mh, item)
- else
- DisableItem(mh, item);
- end;
-
- {$S}
- procedure SetIDItemEnable (menu, item: integer; enable: boolean);
- begin
- SetItemEnable(GetMHandle(menu), item, enable);
- end;
-
- {$S}
- function GetItemEnable (mh: menuHandle; item: integer): boolean;
- begin
- if item > 31 then
- GetItemEnable := true
- else
- GetItemEnable := BTST(mh^^.enableFlags, item);
- end;
-
- {$S}
- function GetIDItemEnable (menu, item: integer): boolean;
- begin
- GetIDItemEnable := GetItemEnable(GetMHandle(menu), item);
- end;
-
- {$S Util2}
- procedure DotItem (mh: menuHandle; item: integer; dotted: boolean);
- begin
- if dotted then
- SetItemMark(mh, item, '•')
- else
- SetItemMark(mh, item, chr(0));
- end;
-
- {$S Util2}
- function MyFrontWindow: boolean;
- var
- wp: windowPtr;
- begin
- wp := FrontWindow;
- if wp = nil then
- MyFrontWindow := false
- else
- MyFrontWindow := windowPeek(wp)^.windowKind >= userKind;
- end;
-
- {$S Util2}
- function DAFrontWindow: boolean;
- var
- wp: windowPtr;
- begin
- wp := FrontWindow;
- if wp = nil then
- DAFrontWindow := false
- else
- DAFrontWindow := windowPeek(wp)^.windowKind < 0;
- end;
-
- {$S Util2}
- function GetIndStrSize (size, id, index: integer): str255;
- var
- s: str255;
- begin
- GetIndString(s, id, index);
- GetIndStrSize := copy(s, 1, size - 1);
- end;
-
- {$S Util}
- procedure GetVersion (var vers: versionRecord);
- var
- vh: handle;
- p: integer;
- begin
- with vers do begin
- vh := GetResource('vers', 1);
- if vh = nil then begin
- version := $0000;
- devcode := $20;
- revision := $00;
- country := 0;
- short := '0.0.0';
- long := 'Unknown v0.0.0';
- end
- else begin
- BlockMove(vh^, @vers, sizeof(vers));
- BlockMove(Ptr(longint(vh^) + (longint(@short) - longint(@vers)) + length(short) + 1), @long, sizeof(long));
- if length(short) >= sizeof(short) then
- {$PUSH}
- {$R-}
- short[0] := chr(sizeof(short) - 1);
- {$POP}
- ReleaseResource(vh);
- end;
- p := pos(short, long);
- while (p > 0) & (vers.long[p] <> ' ') do
- p := p - 1;
- p := p - 1;
- if p < 1 then
- p := 255;
- name := copy(vers.long, 1, p);
- end;
- end;
-
- {$S Util}
- procedure SetVersionParamText (c3: str255);
- var
- vers: versionRecord;
- p: integer;
- begin
- GetVersion(vers);
- ParamText(vers.short, vers.long, vers.name, c3);
- end;
-
- {$S Util}
- function GetDirID (wdrn: integer; var vrn: integer; var dirID: longInt): OSErr;
- var
- procID: longInt;
- oe: OSErr;
- begin
- oe := GetWDInfo(wdrn, vrn, dirID, procID);
- if oe <> noErr then begin
- vrn := wdrn;
- dirID := 0;
- end;
- GetDirID := oe;
- end;
-
- {$S Util2}
- function GetVolInfo (var name: str63; var vrn: integer; index: integer; var CrDate: longInt): OSErr;
- var
- pb: paramBlockRec;
- oe: OSErr;
- begin
- with pb do begin
- if (name <> '') & (name[length(name)] <> ':') then
- name := concat(name, ':');
- pb.ioNamePtr := @name;
- ioVRefNum := vrn;
- ioVolIndex := index;
- oe := PBGetVInfo(@pb, false);
- if oe = noErr then begin
- vrn := ioVRefNum;
- CrDate := ioVCrDate;
- end;
- end;
- GetVolInfo := oe;
- end;
-
- {$S Util}
- procedure PlotSICN (id: integer; index, v, h: integer);
- var
- sh: Handle;
- bm: BitMap;
- r: Rect;
- gp: grafptr;
- begin
- sh := GetResource('SICN', id);
- HLock(sh);
- bm.baseAddr := Ptr(longInt(sh^) + (index - 1) * 32);
- bm.rowBytes := 2;
- SetRect(r, h, v, h + 16, v + 16);
- bm.bounds := r;
- GetPort(gp);
- CopyBits(bm, gp^.portBits, r, r, srcCopy, nil);
- HUnlock(sh);
- end;
-
- function HLockState (h: univ handle): signedByte;
- begin
- HLockState := HGetState(h);
- HLock(h);
- end;
-
- function LookupStrh (id: integer; match: str255): str255;
- var
- t, s: str255;
- i: integer;
- begin
- t := '';
- i := 1;
- repeat
- GetIndString(s, id, i);
- if s = match then begin
- GetIndString(t, id, i + 1);
- leave;
- end;
- i := i + 2;
- until s = '';
- LookupStrh := t;
- end;
-
- function LookupStrhNumber (id: integer; n: longInt): str255;
- var
- s, t: str255;
- begin
- NumToString(n, s);
- t := LookupStrh(id, s);
- if t = '' then
- t := s;
- LookupStrhNumber := t;
- end;
-
-
- function TouchDir (fs: FSSpec): OSErr;
- var
- pb: CInfoPBRec;
- oe: OSErr;
- begin
- pb.ioVRefNum := fs.vRefNum;
- pb.ioDrDirID := fs.parID;
- if fs.name = '' then
- pb.ioNamePtr := nil
- else
- pb.ioNamePtr := @fs.name;
- pb.ioFDirIndex := 0;
-
- oe := PBGetCatInfo(@pb, false);
-
- if oe = noErr then begin
-
- pb.ioDrDirID := pb.ioDrParID;
- pb.ioFDirIndex := 0;
- GetDateTime(pb.ioDrMdDat);
-
- oe := PBSetCatInfo(@pb, false);
- end;
-
- TouchDir := oe;
- end;
-
- function CreateUniqueFile (var fs: FSSpec; creator, ftype: OSType): OSErr;
- var
- oname: str31;
- n: str255;
- i: integer;
- oe: OSErr;
- begin
- oname := fs.name;
- oe := HCreate(fs.vRefNum, fs.parID, fs.name, creator, ftype);
- i := 1;
- while oe = dupFNErr do begin
- NumToString(i, n);
- fs.name := concat(copy(oname, 1, 27), '#', n);
- oe := HCreate(fs.vRefNum, fs.parID, fs.name, creator, ftype);
- i := i + 1;
- end;
- CreateUniqueFile := oe;
- end;
-
- function MyFSWrite (refnum: integer; len: longInt; p: ptr): OSErr;
- var
- oe: OSErr;
- count: longInt;
- begin
- oe := noErr;
- if len > 0 then begin
- count := len;
- oe := FSWrite(refnum, count, p);
- if (oe = noErr) & (count <> len) then
- oe := -1;
- end;
- MyFSWrite := oe;
- end;
-
- end.